; ** por compatibilidad se omiten tildes **
; ==============================================================================
; TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
; ==============================================================================

%include "imprimir.mac"
extern GDT_DESC
extern IDT_DESC
extern idt_inicializar_
extern mmu_inicializar
extern mmu_inicializar_dir_kernel
extern mmu_inicializar_dir_tarea
extern deshabilitar_pic
extern habilitar_pic
extern resetear_pic
extern tss_inicializar
extern inicializar_sched
extern inicializar_tareas
extern pintar_pantalla
extern game_inicializar
global start

;; Saltear seccion de datos
jmp start

;%define ADDR_PAGE_DIR 0x27000

;;
;; Seccion de datos.
;; -------------------------------------------------------------------------- ;;
iniciando_mr_msg db     'Iniciando kernel (Modo Real)...'
iniciando_mr_len equ    $ - iniciando_mr_msg

iniciando_mp_msg db     'Iniciando kernel (Modo Protegido)...'
iniciando_mp_len equ    $ - iniciando_mp_msg

;;
;; Seccion de código.
;; -------------------------------------------------------------------------- ;;

;; Punto de entrada del kernel.
BITS 16
start:
    ; Deshabilitar interrupciones
    cli

    ; Cambiar modo de video a 80 X 50
    mov ax, 0003h
    int 10h ; set mode 03h
    xor bx, bx
    mov ax, 1112h
    int 10h ; load 8x8 font

    ; Imprimir mensaje de bienvenida
    imprimir_texto_mr iniciando_mr_msg, iniciando_mr_len, 0x07, 0, 0
    ; Habilitar A20
   	call habilitar_A20
    ; Cargar la GDT
	lgdt [GDT_DESC]
    ; Setear el bit PE del registro CR0
	mov eax, cr0
	or eax,1
	mov cr0, eax
    ; Saltar a modo protegido
	jmp 0x48:modoprotegido			;selector = {INDEX = 01001 = 9 | TI = 0 | RPL = 00}
BITS 32
modoprotegido:

    ; Establecer selectores de segmentos

	xor eax, eax
	mov ax, 0x58				; selector = {INDEX = 01011 = 11 | TI = 0 | RPL = 00}
	mov ds, ax				; ds selector de segmento de datos
	mov es, ax
	mov gs, ax
	mov ss, ax				; el segmento de pila es el mismo que el de datos de privilegio 0

	xor eax, eax
	mov ax, 0x68				; selector = {INDEX = 01101 = 13 | TI = 0 | RPL = 00}
	mov fs, ax				; fs selector de segmento de video


    ; Establecer la base de la pila
	mov esp, 0x27000
	mov ebp, 0x27000

    ; Imprimir mensaje de bienvenida
	imprimir_texto_mp iniciando_mp_msg, iniciando_mp_len, 0x07, 0, 0

    ; Inicializar pantalla
	xor eax, eax

.CicloPantalla:				;pinta la pantalla de verde

	cmp eax, 8000
	je .FinPantalla
	mov word [fs:eax], 0010101000000000b
	inc eax
	inc eax
	jmp .CicloPantalla
	.FinPantalla:
	;xchg bx, bx

	call pintar_pantalla
    ; Inicializar el manejador de memoria

    ; Inicializar el directorio de paginas
	call mmu_inicializar_dir_kernel
	call inicializar_tareas
    ; Cargar directorio de paginas
	mov eax, 0x27000
	mov cr3, eax
    ; Habilitar paginacion
	mov eax, cr0
	or eax, 0x80000000
	mov cr0, eax

    ; Inicializar tss 
 
    ; Inicializar tss de la tarea Idle
		 
    ; Inicializar tss de las tanques
    
	call tss_inicializar

    ; Inicializar el scheduler

	call inicializar_sched
    
    ; Inicializar la IDT
	call idt_inicializar_
    ; Inicializar Game
	call game_inicializar
    ; Cargar IDT
    	lidt [IDT_DESC]
    ; Configurar controlador de interrupciones
	call deshabilitar_pic
	call resetear_pic
	call habilitar_pic
    ; pintar posiciones inciales de tanques 
    ; Cargar tarea inicial
    ; Habilitar interrupciones
	sti
    ; Saltar a la primera tarea: Iddle


;	xchg bx,bx
	mov ax, 14
	sal ax, 3
	ltr ax
	jmp 0x78:0

    ; Ciclar infinitamente (por si algo sale mal...)


    mov eax, 0xFFFF
    mov ebx, 0xFFFF
    mov ecx, 0xFFFF
    mov edx, 0xFFFF
    jmp $
    jmp $
;; -------------------------------------------------------------------------- ;;
;; -------------------------------------------------------------------------- ;;
%include "a20.asm"

;;----------------------------------------------------------------------------;;






